#include "Peer.h"
#include "Simulacao.h"

extern std::vector<P_Peer> globalPeers;

extern boost::unordered_map<int, int> disponibilidadeBlocos;

Peer::~Peer() {
	delete blocosRecebidos;
	blocosRecebidos = NULL;
}

void Peer::run () {
/*
	while (true) {

		srand(time(NULL));
		P_Peer peer;

		//escolhe um peer aleatrio
		{
			boost::mutex::scoped_lock l(mutexPeers);
			int tam = globalPeers.size();
			if (tam) {
				peer = globalPeers.at(rand()%tam);
			}
		}

		//escolhe um bloco q ele n�o tenha
		if (peer) {
			setOcupado(true);
			std::vector<int> blocosLivres = peer->getBlocosLivres();
			//dorme um tempo exponencial
			Sleep(amostraExponencial(taxaUpload));

			//marca o bloco como transferido
			if (blocosLivres.size()) {
				int bloco = blocosLivres.at(rand() % blocosLivres.size());
				peer->setBlocoTransferido(bloco);
				//Verifica se o peer virou seed
				blocosLivres = peer->getBlocosLivres();
				disponibilidadeBlocos[bloco]++;
				if(!blocosLivres.size()){
					peer->isSeed = true;
				}
			}
			setOcupado(false);
		}
	}
 */ 
}

std::vector<int> Peer::getBlocosLivres() const {
	std::vector<int> ret;
	for (int i=0; i<blocos; ++i) {
		if (blocosRecebidos[i] == true) {
			ret.push_back(i);
		}
	}
	return ret;
}

void Peer::setBlocoTransferido(int bloco) {
	blocosRecebidos[bloco] = true;
}

void Peer::setOcupado(bool status){
	ocupado = status;
}

void Peer::setIsSeed(bool status){
	isSeed = status;
}